          SUBROUTINE (PASSER)
** Version# 111.0002[14] - 06/05/2014 - 12:23pm - TSMITH - eclipse
*** V111.0002 Change - Custom Coding . - 06/05/2014 - TSMITH - eclipse
** Copied from CBP AR.INQ Version# 111.0001 - 10/29/2013 - 10:42am - TSMITH - eclipse
*** V111.0001 Change - Custom Coding . - 10/29/2013 - TSMITH - eclipse
*** V109.0001 Change - Custom Coding . - 04/15/2012 - TSMITH - eclipse

*** Subroutine - AR.INQ
*-------------------------------------------------------------------------*
*** Accounts Receivable Inquiry - This screen allows user to view all
*** open orders, balances, credit inquiries, and any other account issues
*** pertaining to a customer.
*-------------------------------------------------------------------------*
*** Passer can be null!
***
*** PASSER<1,1> - Customer Number                                     (IN)
*** PASSER<1,2> - As of Date                                          (IN)
*** PASSER<1,3> - Bill-To only flag. When passed in, only items where (IN)
***               the Customer passed in is both the Bill-To and the
***               Ship-To will be included.
*-------------------------------------------------------------------------*
*** COMMON Variables: CUS, CUSS
*-------------------------------------------------------------------------*
          *** init the toggle view for display NOTE: done here, not in
          *** start so the view can stay changed until exit of ar.inq
          TOG.VIEW = 1; OLID.LIST = ''
          CHECK.KEY 'AR.ALLOWED',ENTRY.OK
          IF NOT(ENTRY.OK) THEN RETURN
          SEL.BT.ONLY = PASSER<1,3>
          CN = PASSER<1,1>
          IF PASSER<1,2>#'' THEN
             AOD = PASSER<1,2>
             CN  = PASSER<1,1>
             AGD = AOD
             IF AOD = DATE() THEN AOD = ''
          END ELSE
             AOD = ''
             AGD = DATE()
          END

          IF REMOTE.CUST THEN CN = REMOTE.CUST
          IF CN='' THEN ONE.PASS=NO ELSE ONE.PASS=YES
*-------------------------------------------------------------------------*
          *** Setup A/R Aging Bucket Names - Use TYPE 3 for column data

          BUCKETS = AR.AGING.BUCKET.NAMES(3)

          DIM AGDESC(7)
          AGDESC(1) = BUCKETS<1>      ;* 'Fut'
          AGDESC(2) = BUCKETS<2>      ;* 'Cur'
          AGDESC(3) = BUCKETS<3>      ;* '30+'
          AGDESC(4) = BUCKETS<4>      ;* '60+'
          AGDESC(5) = BUCKETS<5>      ;* '90+'
          AGDESC(6) = BUCKETS<6>      ;* '120'
          AGDESC(7) = 'Depos'
          BAL.FWD = ''
          BF.DET.VIEW =  NO
*-------------------------------------------------------------------------*
          IF REMOTE.CUST THEN SCRN="AR.INQ.ROE" ELSE SCRN="AR.INQ"
          WINDOW SCRN=SCRN
          VSCROLL.DEFINE 1,1,11,78,9,'AR.INQ'
          VSCROLL.SET 1
          READV AUTH.BR.ONLY FROM CTRLFILE,'AR.AP.INQ.BRS',1 ELSE AUTH.BR.ONLY=''
          IF AUTH.BR.ONLY THEN INQ.BRS = SECURITY<9> ELSE INQ.BRS = ''
          MO.DISP=6
          TMO='6-'
          TOGGLE=0
          UT.SEC3 14,EIS.OK
          READV DFLT.CUST.SRC FROM CTRLFILE,'DFLT.CUST.ACT.AR',1 ELSE DFLT.CUST.SRC = ''
          *** read in the balance forward control record
          READ BAL.FWD.REC FROM CTRLFILE,'AR.BF.VIEW' ELSE BAL.FWD.REC = ''

          UT.OPEN.FILE 'AR.COLLECTION',ARCFILE,ERR.MSG
          IF ERR.MSG THEN RETURN

          *** Do they have auth for printing invoices?
          CHECK.KEY "SOE.PRINT.INVOICE",PRINT.INV.AUTH
          CHECK.KEY "SOE.REPRINT.INVOICE",REPRINT.INV.AUTH
          ENABLE.PRINT = (PRINT.INV.AUTH OR REPRINT.INV.AUTH)
*-------------------------------------------------------------------------*
START:  *** Start to AR inq process
          CLEAR.SCREEN
          *** Display AR Aging bucket titles on screen  Type 1 for 6 names
          BUCKETS = AR.AGING.BUCKET.NAMES(1)
          PRINT @(1,3):BUCKETS<1> "L#7"     ;* Future
          PRINT @(1,4):BUCKETS<2> "L#7"     ;* Current
          PRINT @(1,5):BUCKETS<3> "L#7"     ;* 31-60
          PRINT @(1,6):BUCKETS<4> "L#7"     ;* 61-90
          PRINT @(1,7):BUCKETS<5> "L#7"     ;* 91-120
          PRINT @(1,8):BUCKETS<6> "L#7"     ;* Over 120

          IF REMOTE.CUST THEN
             TOP = 'Reference #'
          END ELSE
             * Make sure the variable tog.view is maintained on clearing
             * of the screen.  This is a binary switch, 1 show PO, 0 show
             * the reference #.
             BEGIN CASE
             CASE TOG.VIEW = 1
                TOP =  'Reference #'
             CASE TOG.VIEW = 2
                TOP =  'Customer P/O #'
             CASE TOG.VIEW = 3
                TOP =  'Job Name'
             CASE OTHERWISE
                TOP =  'Old Invoice #'
             END CASE
          END

          PRINT @(1,10):TOP

          OID.LIST  = '' ;* init search list for OID
          PO.LIST   = '' ;* init search list for PO.LIST
          JOB.LIST  = '' ;*
          DT.LIST   = '' ;* init search list for DT.list
          OLID.LIST = '' ;* Legacy id list
*-------------------------------------------------------------------------*
          OID.DATA$<4> = ''
          OPTION = 0
INCUS:    IF CN = '' THEN
INCUS2:      INP CN,8,1,35,VERIFY='S:VERF.CUS.ID'
             IF QUIT THEN GOTO FINISH
             IF CN = '' THEN GOTO INCUS2
             AOD = ''
             AGD = DATE()
          END
          USER.LOG.HISTORY 6,CN,NO
          OID.DATA$<4> = CN
          ACT.ID$      = CN
          BT = GET.BT.AR(CN)
          GET.CUS '',BT,CN,''
          GOSUB DISP1

          *** check to see if the balance forward control record is
          *** set.  If so then we need to see if this customer receives
          *** balance forward statements.  If so then we need to print
          *** balance forward lines for each of the different aging buckets
          *** rather than displaying all invoices
          IF BAL.FWD.REC THEN
            IF CUS(63) #'B' THEN
              IF CUSS(63) #'B' THEN BAL.FWD = NO ELSE BAL.FWD = YES
            END ELSE
             BAL.FWD = YES
            END
          END

          *** The call to load hotkeys has been removed from here to take
          *** care of a bug created when OE reminder messages appear.
          *** If there was a reminder message and the user hit a hotkey
          *** before hitting <enter>, the OE.DISP.ENTITY.MSG would take the
          *** koykey as being a contiune command to the message and would
          *** then disable the functionality of the AR.INQ screen (eg
          *** moving around in the screen and using hotkeys).
*-------------------------------------------------------------------------*
REDISP: *** redisplay the AR data
          GOSUB GET.INFO
REDISP2:  LASTKEY = 0; MODE = 0; COL = 1; LINE = 1; QUIT = NO
          GOSUB DISP2

          *** load the hotkeys only after everything has been displayed to
          *** the screen.
          GOSUB HOTKEYS
*-------------------------------------------------------------------------*
MOVENEXT: *** Move to next line
          IF QUIT THEN GOTO ENDIT
          DNOK = (LINE < IDN)
          PARSEMOVE COL,LINE,1,IDN,9,DNOK,DNOK
          IF LINE > LAST.LINE THEN
             FOR IDX = LAST.LINE+1 TO LINE
             GOSUB DLINE
             NEXT IDX
             LAST.LINE = LINE
          END
          REF.ID = OCONV(DTIDS<LINE>,'G1.2')
          OID.DATA$<1> = 'REF~':REF.ID
          OID    = FIELD(REF.ID,'.',1)
          INVN   = FIELD(REF.ID,'.',2)+0
          READV INVNS FROM LEDFILE,OID,8 ELSE INVNS = ''
          LOCATE INVN IN INVNS<1> SETTING GEN ELSE GEN = ''
          OID.DATA$<2> = GEN

IN.ANS:   INPV A,0,LINE,14
          IF CHANGED THEN
             *** check the toggle for PO/Ref#
             BEGIN CASE
             CASE TOG.VIEW = 1
                TMP.ID = FIELD(DTIDS<LINE>,'.',2):'.':FIELD(DTIDS<LINE>,'.',3)
                READ ARREC FROM ARFILE,TMP.ID ELSE ARREC = ''
                IF TMP.ID[1,1]#'S' AND TMP.ID[1,1]#'R' THEN
                   TMP=ARREC<1>
                   IF TMP='' THEN TMP=TMP.ID
                   TMP.ID = 'CK#':TMP<1,1>
                END
                VPRINT  0,LINE,TMP.ID                 "L#14"
             CASE TOG.VIEW = 2
                VPRINT  0,LINE,PO.LIST<LINE>              "L#14"
             CASE TOG.VIEW = 3
                VPRINT  0,LINE,JOB.LIST<1,LINE>          "L#14"
             CASE TOG.VIEW = 4
                VPRINT  0,LINE,OID.LIST<1,LINE>          "L#14"
             END CASE

             GOTO.LINE = ''
             KEY = A
             GOSUB DO.SRCH

             *** if GOTO.LINE then goto the line searched for
             IF GOTO.LINE THEN
                LINE = GOTO.LINE
                IF LINE > LAST.LINE THEN
                   FOR IDX = LAST.LINE+1 TO LINE
                      GOSUB DLINE
                   NEXT IDX
                   LAST.LINE = LINE
                END
                GOTO IN.ANS
             END ELSE
             *** just moving lines with cursor
                IF LINE > LAST.LINE THEN
                   FOR IDX = LAST.LINE+1 TO LINE
                      GOSUB DLINE
                   NEXT IDX
                   LAST.LINE = LINE
                END
                GOTO IN.ANS
             END
          END

          GOTO MOVENEXT
*-------------------------------------------------------------------------*
ENDIT:    *** exit ar inq
          IF ONE.PASS THEN
             GOTO FINISH
          END ELSE
             CN = ''
             GOTO START
          END
*-------------------------------------------------------------------------*
FINISH: *** close window and return
          WINDOW.CLOSE
          RETURN
*-------------------------------------------------------------------------*
GET.INFO: *** Get the AR ids based on the date and customer
          LME        = REALDATE('MO-1/FE/YR',AOD)

          FIRST.PASS = YES
          IF SEL.BT.ONLY THEN
             CUST.NO = CN:AM:CN
          END ELSE
             CUST.NO = CN
          END

          ASUB.DATA.GET.PARENT.GPS AGT,DTIDS,,,CUST.NO,AOD,AGD,INQ.BRS,1,,LME,XTYPE

          GOSUB DO.SRCH.SETUP  ;* setup the search lists with DTIDS data

          TOT.AR = SUMMATION(AGT)
          IF AOD = '' THEN ASOF=DATE() ELSE ASOF=AOD
          BEG.DT = REALDATE("FB/FB/YR",ASOF)
          ETRX.AMT.GET YTD,CN,BEG.DT,ASOF,,'SLS'
          BEG.DT = REALDATE("MO/FB/YR",ASOF)
          ETRX.AMT.GET MTD,CN,BEG.DT,ASOF,,'SLS'
          AR.LASTTRANS CN,AOD,'S',LSDATE,LSREF,LSAMT
          *** CASHONLY - Flag to not include discount amount in the last
          *** payment field. Only amt posted to cash account is returned.
          CASHONLY = YES
          AR.LASTTRANS CN,AOD,'C':AM:CASHONLY,LPDATE,LPREF,LPAMT
          OPEN.AMT = OPEN.ORDER.AMT(CN)
          GET.AVAIL.CREDIT CN,CREDIT.AVAIL,,,CREDIT.LIMIT
          GET.AVAIL.DISC DTIDS,AGD,INQ.BRS,DISC.AMT

          GOSUB CHK.BT.ONLY

*** If we're not in base currency then we need to divide the amounts.
          IF XTYPE # '' THEN
             YTD   = ICONV(YTD/XRATE,'MR0')
             MTD   = ICONV(MTD/XRATE,'MR0')
             LSAMT = ICONV(LSAMT/XRATE,'MR0')
             LPAMT = ICONV(LPAMT/XRATE,'MR0')
             OPEN.AMT = ICONV(OPEN.AMT/XRATE,'MR0')
             CREDIT.AVAIL = CREDIT.AVAIL/XRATE
             CREDIT.LIMIT = CREDIT.LIMIT/XRATE
             DISC.AMT     = DISC.AMT/XRATE
          END
          RETURN
*-------------------------------------------------------------------------*
DO.SRCH.SETUP: * This routine will setup the search list info so if a user
               * types in an OID it will search for that OID in the PO and
               * in the sales order.

          *** Step through the ledger sales orders and setup the P/O
          *** number , OID, and date lists for that order to search on.
          OID.LIST    = ''   ;* The list containing the OIDs for the CN
          PO.LIST     = ''   ;* list of POs to match with OID line.
          JOB.LIST    = ''   ;* list of Job names to match with OID line
          DT.LIST     = ''   ;* The list containing the date matchin OID
          CHK.OID     = ''   ;* parsed off oid from DTIDS
          CHK.DT      = ''   ;* parsed off date from DTIDS
          CHK.GEN     = ''   ;* parsed off gen from DTIDS

          DTIDS.CT = DCOUNT(DTIDS,AM)   ;* get the count of ORDERS to check
          FOR DD.LN = 1 TO DTIDS.CT
             SOID    = DTIDS<DD.LN>          ;* pop OID info one at a time
             CHK.OID = FIELD(SOID,'.',2)     ;* Order Num minus gen
             CHK.GEN = FIELD(SOID,'.',3)+0   ;* order gen

             AR.ID   = CHK.OID:'.':CHK.GEN "R%3"   ;* OID and AR.ID
             PO      = ''   ;* the customer po.  SET IN SOE HEADER!
             JOB     = ''   ;* the job name. SET IN SOE HEADER
             ;* read the Customer P/O# from the ARFILE
             *JOBGEN = FIELD(SOID,'.',3)
             READV PO FROM ARFILE,AR.ID,1 ELSE PO = ''
             READV JOB FROM LEDFILE,CHK.OID,65 ELSE JOB = ''
             *** insert found PO (if null also) into the PO list.
             PO.LIST  = INSERT(PO.LIST,DD.LN; PO)
             JOB.LIST = INSERT(JOB.LIST,DD.LN; JOB<1,1>)
             *** setup the date
             DT.LIST  = INSERT(DT.LIST,DD.LN; FIELD(DTIDS<DD.LN>,'.',1))
             *** setup the search info list.
             OID.LIST = INSERT(OID.LIST,DD.LN;AR.ID)

          NEXT DD.LN
          RETURN
*-------------------------------------------------------------------------*
DO.SRCH: * This routine will take the list of items on the screen and
*** remove those lines that do not contain a match from the list and popup
*** a menu for the user to select a line (eg OID,PO) and then on return
*** from this routine setting the line (GOTO.LINE) to go to that selection.

          SEARCH.LIST = ''                 ;* init search list
          SV.OID.LIST = OID.LIST           ;* save the list to restore
          SV.PO.LIST  = PO.LIST            ;* save the list to restore
          SV.DT.LIST  = DT.LIST           ;* save the list to restore

          LIST.CT = DCOUNT(OID.LIST,AM)    ;* list count

          *** parsing down the list to the search criteria (eg the key)
          FOR LN = LIST.CT TO 1 STEP -1
             PO.SRCH.ANS  = NOT(INDEX(UPCASE(PO.LIST<LN>), UPCASE(KEY),1))
             OID.SRCH.ANS = NOT(INDEX(UPCASE(OID.LIST<LN>),UPCASE(KEY),1))

             *** if key is not in PO or OID list, delete that line
             IF PO.SRCH.ANS AND OID.SRCH.ANS THEN
                OID.LIST = DELETE(OID.LIST,LN)
                PO.LIST  = DELETE(PO.LIST ,LN)
                DT.LIST  = DELETE(DT.LIST ,LN)
             END
          NEXT LN

          CHK.COUNT = DCOUNT(OID.LIST,AM)

          *** If there are no matches, return to current line
          *** and restore the search lists.
          IF CHK.COUNT = 0 THEN
             OID.LIST  = SV.OID.LIST
             PO.LIST   = SV.PO.LIST
             DT.LIST   = SV.DT.LIST
             GOTO.LINE = LINE
             RETURN
          END

          *** Build the search list (it is temporary)
          FOR I = 1 TO CHK.COUNT
             SR.LIST  = ''
             SR.LIST  = OID.LIST<I> "R#14":' - ':PO.LIST<I>"R#18"
             SR.LIST := ' - ':OCONV(DT.LIST<I>,'D2/')"R#8"
             SEARCH.LIST<-1> = SR.LIST
          NEXT I

          IF NOT(CHK.COUNT <= 1) THEN
             TITLE = 'Order #Customer P/O #DATE'
             MENU.TABLE VAL,5,5,1,5,48,,,LOWER(SEARCH.LIST),TITLE
          END ELSE
             VAL = SEARCH.LIST<1>
          END

          IF VAL = '' THEN
             *** If they didn't select anything, set S.OID to null
             ANSWER = ''
          END ELSE
             *** if they selected an order, trim off the order from
             *** the select list.
             ANSWER = TRIM(FIELD(VAL, '-',1))
          END

          *** locate what they selected in the saved list setting the ID
          *** so we know what line to go to on return from this
          *** subroutine. If not in the list, return to current line
          LOCATE ANSWER IN SV.OID.LIST SETTING GOTO.LINE ELSE
             GOTO.LINE = LINE
          END

          *** restore the search list from the saved list
          OID.LIST = SV.OID.LIST
          PO.LIST  = SV.PO.LIST
          DT.LIST  = SV.DT.LIST

          RETURN
*-------------------------------------------------------------------------*
DISP1: *** Display customer description
          PRINT @(8,1) :CUSS(9)                               "L#35"
          IF TRIM(CUSS(158)) # '' THEN
             PRINT @(43,1):BLINK$:'*':NORM$
          END ELSE
             PRINT @(43,1):' '
          END
          PRINT @(55,4):OCONV(CUSS(28),'TTERMS;X;1;1')        "L#20"
          PRINT @(51,1):OCONV('16938',"D4/")                 "L#10"
          PRINT @(55,2):TRIM(CUSS(16)<1,1>)                   "L#24"
          PRINT @(55,3):CUSS(17)<1,1>                         "L#24"

*** Foreign exchange module.
          XDATE = DATE()
          IF CUSS(90) THEN
             XCURR.RATE.GET XRATE,CUSS(90),XDATE
             XRATE = OCONV(XRATE,'MR4')
             XTYPE = CUSS(90)
             PRINT @(78-LEN(XTYPE),0):BLINK$:XTYPE:NORM$
          END ELSE
             PRINT @(60,0):NORM$:''
             XRATE = 1
             XTYPE = ''
          END
          RETURN
*-------------------------------------------------------------------------*
DISP2:   *** display rest of header information
          IF AOD = '' THEN PRINT @(68,1):SPACE(10): ELSE
             PRINT @(68,1):OCONV(AOD,'D4/')            "L#10"
          END

          IF MO.DISP=6 THEN
             TMO='6-'
             MV.OFFSET=0
          END ELSE
             TMO=12
             MV.OFFSET=4
          END

          PRINT @(32,4):OPEN.AMT                       "R26,#12"
          PRINT @(32,5):MTD                            "R26,#12"
          PRINT @(32,6):YTD                            "R26,#12"
          PRINT @(22,7):TMO "L#2"
          PRINT @(32,7):ICONV(CUSS(47)<1,2+MV.OFFSET>/XRATE,'MR0')"R26,#12"
          PRINT @(22,8):TMO "L#2"
          PRINT @(32,8):ICONV(CUSS(47)<1,3+MV.OFFSET>/XRATE,'MR0')"R26,#12"
          PRINT @(32,9):CUSS(47)<1,4+MV.OFFSET>         "R0,#6"
          PRINT @(55,5):OCONV(CREDIT.LIMIT,'MR2')      "R0,#9"
          PRINT @(69,5):OCONV(CREDIT.AVAIL,'MR2')      "R0,#9"
          PRINT @(55,6):OCONV(LSDATE,"D2/")"L#11":LSAMT "R26,#12"
          PRINT @(55,7):OCONV(LPDATE,"D2/")"L#11":-LPAMT"R26,#12"
          PRINT @(66,8):DISC.AMT                       "R26,#12"
          PRINT @(66,9):(TOT.AR - DISC.AMT)            "R26,#12"

          PRINT @(9,3):AGT<1>                          "R26,#12":
          PRINT @(9,4):AGT<2>                          "R26,#12":
          PRINT @(9,5):AGT<3>                          "R26,#12":
          PRINT @(9,6):AGT<4>                          "R26,#12":
          PRINT @(9,7):AGT<5>                          "R26,#12":
          PRINT @(9,8):AGT<6>                          "R26,#12":
          PRINT @(9,9):TOT.AR                          "R26,#12":
          PRINT @(32,3):AGT<7>                         "R26,#12":

          VIEW = ACTIVE.VIEW.<WINDOW.LEVEL>
          IF VIEW THEN
             DEF = VSCROLL.DEF.<WINDOW.LEVEL,VIEW>
             OFFSET = DEF<1,1,1>
          END ELSE OFFSET = 0

          VCLR 1
          IF BAL.FWD AND FIRST.PASS THEN
             FIRST.PASS = NO
             GOSUB SET.BALFWD.INFO
             DTIDS = DTIDS.CURR
          END

          IDN     = DCOUNT(DTIDS,AM)
          MAXSET.INPV IDN
          IF (IDN - OFFSET) > 9 THEN IDNN = (9 + OFFSET) ELSE IDNN = IDN
          FOR IDX = 1 TO IDNN
             GOSUB DLINE
          NEXT IDX

          LAST.LINE = IDNN

          IF TOGGLE THEN GOTO TOG.OFF

          SOE.CREDIT.CHECK CN,NO.OE,COD,PRT.MSG,NO.SHIP,AUTHNAME,MESSAGE,'',''

          IF NO.OE OR COD OR NO.SHIP OR PRT.MSG THEN

             DICT.ID='CREDIT.CTRL'
             FLNM='CUSTOMER'
             MATBUILD UDATA FROM CUSS
             GET.DICT.VALUE DICT.ID,FLNM,CN,UDATA,DICT.VAL,DICT.ERR,CONV.STR
             CR.MSG='Current Credit Control Setting:'
             SS=1
             LOOP
             UNTIL DICT.VAL<1,SS>='' DO
                CR.MSG<-1>=SPACE(5):DICT.VAL<1,SS>
                SS += 1
             REPEAT

             IF MESSAGE # '' THEN
                CR.MSG<-1>=SPACE(5)
                CR.MSG<-1>="Next Order's Credit Status:"
                CR.MSG<-1>=SPACE(5):MESSAGE
             END
             SS=1
             MAX.LEN=0
             LOOP
             UNTIL CR.MSG<SS>='' DO
                TLEN=LEN(CR.MSG<SS>)
                IF TLEN > MAX.LEN THEN MAX.LEN=TLEN
               SS += 1
             REPEAT
             Y = 7 + (10 - SS)
             X = 40 - (MAX.LEN/2)
             MESS X,Y,CR.MSG
          END
          REMINDER.VIEW BT,,14
          IF CN # BT THEN
             REMINDER.VIEW CN,,14
          END
          OE.DISP.ENTITY.MSG BT,CN

TOG.OFF:  TOGGLE=0

          RETURN
*-------------------------------------------------------------------------*
SET.BALFWD.INFO: *** Set up the balance forward information

          DTIDS.CURR = ''  ;* list of current ar ids
          DTIDS.30   = ''  ;* list of aged 30 ar ids
          TOTS       = ''  ;* sum of payments,balances for each bucket
          DTIDS.120  = ''  ;* list of aged 120 ar ids
          DTIDS.90   = ''  ;* list of aged 90 ar ids
          DTIDS.60   = ''  ;* list of aged 60 ar ids

          ID.CNT     = DCOUNT(DTIDS,AM)
          FOR ID = 1 TO ID.CNT
             DTID = DTIDS<ID>
             AR.ID  = OCONV(DTID,'G1.2')
             READ ARREC FROM ARFILE,AR.ID ELSE ARREC = ''
             STAT = ARREC<18>
             BAL    = AR.GET.BAL(ARREC,AOD)
             CR     = AR.GET.APPS(ARREC,,LME,AOD)
             IF STAT = 'CINV' THEN
                CR = 0
             END
             AG     = AR.GET.AGE(ARREC,BAL,AGD,AR.ID)
             BEGIN CASE
             CASE AG = 1 OR AG = 2 OR AG = 7
                DTIDS.CURR<-1> = DTID
             CASE AG = 3
                DTIDS.30<-1>   = DTID
                TOTS<1,1>     += CR
                TOTS<1,2>     += BAL
             CASE AG = 4
                DTIDS.60<-1>   = DTID
                TOTS<2,1>     += CR
                TOTS<2,2>     += BAL
             CASE AG =5
                DTIDS.90<-1>   = DTID
                TOTS<3,1>     += CR
                TOTS<3,2>     += BAL
             CASE AG = 6
                DTIDS.120<-1>  = DTID
                TOTS<4,1>     += CR
                TOTS<4,2>     += BAL
             END CASE
          NEXT ID
          NUM.AGES = 0
          IF DTIDS.30 THEN
             NUM.AGES += 1
             DTIDS.CURR = INSERT(DTIDS.CURR,NUM.AGES;'B30')
          END

          IF DTIDS.60 THEN
             NUM.AGES += 1
             DTIDS.CURR = INSERT(DTIDS.CURR,NUM.AGES;'B60')
          END

          IF DTIDS.90 THEN
             NUM.AGES += 1
             DTIDS.CURR = INSERT(DTIDS.CURR,NUM.AGES;'B90')
          END

          IF DTIDS.120 THEN
             NUM.AGES += 1
             DTIDS.CURR = INSERT(DTIDS.CURR,NUM.AGES;'B120')
          END

          RETURN
*-------------------------------------------------------------------------*
DLINE:    *  print detail lines

          STAT = ''
          DTID   = DTIDS<IDX>
          IF DTID='' THEN RETURN
          BEGIN CASE
          CASE DTID = 'B30'
             BFWD.LN = YES
             CR      = TOTS<1,1>
             BAL     = TOTS<1,2>
             AG      = 3
          CASE DTID = 'B60'
             BFWD.LN = YES
             CR      = TOTS<2,1>
             BAL     = TOTS<2,2>
             AG      = 4
          CASE DTID = 'B90'
             BFWD.LN = YES
             CR      = TOTS<3,1>
             BAL     = TOTS<3,2>
             AG      = 5
          CASE DTID = 'B120'
             BFWD.LN = YES
             CR      = TOTS<4,1>
             BAL     = TOTS<4,2>
             AG      = 6
          CASE OTHERWISE
             BFWD.LN = NO
             AR.ID  = OCONV(DTID,'G1.2')
             READ ARREC FROM ARFILE,AR.ID ELSE ARREC = ''
             STAT = ARREC<18>
             BAL = AR.GET.BAL(ARREC,AOD)
             CR  = AR.GET.APPS(ARREC,,LME,AOD)
             IF STAT = 'CINV' THEN
                CR = 0
             END
             AG  = AR.GET.AGE(ARREC,BAL,AGD,AR.ID)
          END CASE
*** Convert to the correct currency.
          IF XTYPE # '' THEN
             IF XTYPE # ARREC<31,1,1> THEN
                XCURR.RATE.GET NXRATE,XTYPE,ARREC<13>
             END ELSE
                NXRATE = ARREC<31,1,2>
             END
             NXRATE = OCONV(NXRATE,'MR4')
             BAL    = ICONV(OCONV(BAL,'MR2')/NXRATE,'MR2')
             CR     = ICONV(OCONV(CR,'MR2')/NXRATE,'MR2')
          END

          IF NOT(BFWD.LN) THEN
             STAT= ARREC<27>
             IF NOT(CR) THEN PDT='' ELSE
                PDT = AR.GET.DTPD(ARREC,,AOD)
             END
             DT     = FIELD(DTID,'.',1)
             SCO    = ARREC<18>
             IF SCO = 'SC' THEN AR.ID = AR.ID[1,10]:'-S/C'
             IF AR.ID[1,1]#'S' AND AR.ID[1,1]#'R' THEN
                TMP=ARREC<1>; IF TMP='' THEN TMP=AR.ID
                AR.ID = 'CK#':TMP<1,1>
             END

             *** If toggle view is set, show the PO for the OID.
             BEGIN CASE
             CASE TOG.VIEW = 1
                VPRINT  0,IDX,AR.ID                 "L#14"
             CASE TOG.VIEW = 2
                VPRINT  0,IDX,PO.LIST<IDX>          "L#14"
             CASE TOG.VIEW = 3
                VPRINT  0,IDX,JOB.LIST<IDX>         "L#14"
             CASE OTHERWISE
                TOID = FIELD(AR.ID,'.',1)
                READV OLD.ID FROM LEDFILE,TOID,83 ELSE OLD.ID = ''
                OLD.ID = OLD.ID<1,1>
                IF NOT(OLD.ID) THEN OLD.ID = AR.ID
                OLID.LIST<1,IDX> = OLD.ID
                VPRINT  0,IDX,OLID.LIST<1,IDX>      "L#14"
             END CASE

             VPRINT 15,IDX,ARREC<14>        "R#4"
             VPRINT 20,IDX,OCONV(DT,'D2/')  "L#8"
             VPRINT 54,IDX,OCONV(PDT,'D2/') "L#8"


          END ELSE
             VPRINT  0,IDX,'Balance Fwd'            "L#12"
          END

          VPRINT 29,IDX,BAL+CR           "R26Z#12"
          VPRINT 42,IDX,CR               "R26Z#11"
          IF STAT # '' THEN
             VPRINT 42,IDX,'*'
             IF CR=0 THEN
                VPRINT 49,IDX,STAT       "L#4"
             END
          END
          VPRINT 63,IDX,BAL              "R26Z#11"
          VPRINT 75,IDX,AGDESC(AG)       "L#3"
          RETURN
*-------------------------------------------------------------------------*
CHK.BT.ONLY:* look for bill to invoices only
          IF NOT(SEL.BT.ONLY) THEN RETURN

          TMP.BT = GET.BT.AR(CN)
          IF TMP.BT # CN THEN RETURN

          DCT = DCOUNT(DTIDS,AM)

          FOR J = DCT TO 1 STEP -1
             DTID   = DTIDS<J>
             IF DTID='' THEN GOTO NEXT.J

             AR.ID  = OCONV(DTID,'G1.2')
             READV TMP.ST FROM ARFILE,AR.ID,15 ELSE TMP.ST = ''
             TMP.ST = TMP.ST<1,1>

             IF TMP.ST # TMP.BT THEN
                *** deleting the LISTs updated in DO.SRCH.SETUP
                DTIDS    = DELETE(DTIDS,J)
                OID.LIST = DELETE(OID.LIST,J)
                DT.LIST  = DELETE(DT.LIST,J)
                PO.LIST  = DELETE(PO.LIST,J)
             END
NEXT.J:   NEXT J


          RETURN
*-------------------------------------------------------------------------*
HOTKEYS:  *** Load hotkeys
          MENU.CLEAR
          TMP.BT = GET.BT.AR(CN)

          IF REMOTE.CUST THEN
             MENU.LOAD  1,21,11,1,'O'    ;* Open orders
             MENU.LOAD  13,21,4,1,'B'    ;* Bids
             MENU.LOAD                   ;* Notes
             MENU.LOAD  18,21, 4,1,'D'   ;* Date
             MENU.LOAD                   ;* Rank
             MENU.LOAD 23,21, 6,1,'L'    ;* Ledger
             MENU.LOAD 30,21, 4,1,'V'    ;* View Order
             MENU.LOAD 35,21, 4,1,'E'    ;* Edit Order
             MENU.LOAD                   ;* Audit A/R
             MENU.LOAD                   ;* Addition inquiries
             MENU.LOAD                   ;* Log
             MENU.LOAD                   ;* Log Call
             MENU.LOAD                   ;* Currency
             MENU.LOAD                   ;* Currency
             MENU.LOAD                   ;* Month 6 or 12
             MENU.LOAD                   ;* A/R Summary
             MENU.LOAD                   ;* Change view
          END ELSE
             MENU.LOAD                   ;* Open Orders
             MENU.LOAD                   ;* Bids
             MENU.LOAD  1,21, 4,1,'N'    ;* Notes
             MENU.LOAD  6,21, 2,1,'D'    ;* Date
             MENU.LOAD 13,21, 4,1,'R'    ;* Rank
             MENU.LOAD 18,21, 6,4,'L'    ;* Ledger
             MENU.LOAD 25,21, 4,1,'V'    ;* View order
             MENU.LOAD 30,21, 4,1,'E'    ;* Edit order
             MENU.LOAD 35,21, 5,2,'U'    ;* Audit A/R
             MENU.LOAD 41,21, 3,3,'Q'    ;* Addition inquiries
             MENU.LOAD 45,21, 3,2,'O'    ;* Log
             MENU.LOAD 56,21, 7,3,'G'    ;* Log Call
             MENU.LOAD 78, 0, 1,1,'$'    ;* Currency
             MENU.LOAD ,,,,'4'           ;* Currency
             MENU.LOAD 64,21, 4,1,'6'    ;* Month 6 or 12
             MENU.LOAD 49,21, 6,4,'S'    ;* A/R Summary
             MENU.LOAD 75,21, 4,1,'C'    ;* Change view
          END

          IF REMOTE.CUST THEN
             MENU.LOAD                   ;* Reset
             MENU.LOAD                   ;* Print
          END ELSE
             IF BAL.FWD THEN
                MENU.LOAD 69,21, 5,5,'T' ;* Reset
             END ELSE
                MENU.LOAD
             END

             IF ENABLE.PRINT THEN
                MENU.LOAD 9,21, 3,1,'P'  ;* Print
             END ELSE
                MENU.LOAD
             END
          END
          RETURN
*-------------------------------------------------------------------------*
SUBS:     ON OPTION GOTO ORDERS,BIDS,NOTES,CHDATE,DSP.RNK,LEDGER,VIEW,EDIT,AUDIT,INQUIRY,ACTVTY,LOG.CALL, XCH, XCH, CHG.MO.DISP,AR.SUM,CHNGV,RESET.VIEW,PRNT
*-------------------------------------------------------------------------*
AR.SUM:  * set up bill to information only
          AR.INQ.SUMMARY CN
          RETURN
*-------------------------------------------------------------------------*
ORDERS:   *** display open orders
          SALES.INQ CN,1
          RETURN
*-------------------------------------------------------------------------*
BIDS:     *** display open bids
          SALES.INQ CN,3
          RETURN
*-------------------------------------------------------------------------*
NOTES: *** allows for a job queue to be entered.
          JOB.TRACKING.ENTRY 'CUST~':CN:AM:AM:DFLT.CUST.SRC:AM:AM:AM:AM:'1':AM:AM:'1'
          RETURN
*-------------------------------------------------------------------------*
CHDATE:   *** change as of date
          IF AOD = '' THEN
             REALDATE DT,'MO/FE/YR'
             PRINT @(68,1):OCONV(DT,'D4/')   "L#10"
          END
          SV = AOD
IN$$1:    INP AOD,68,1,10,"D4/"
          IF QUIT THEN RETURN TO ENDIT
          IF SV#AOD THEN
             IF AOD = '' THEN PRINT BELL:; GOTO CHDATE
             AGD=AOD
             RETURN TO REDISP
          END
          RETURN
*-------------------------------------------------------------------------*
PRNT:     *** display Customer Reprint Invoices screen
          CUS.INVOICE.REPRINT CN
          RETURN
*-------------------------------------------------------------------------*
DSP.RNK:  *** display customer rank information
          CUS.RANK.VIEW CN
          RETURN
*-------------------------------------------------------------------------*
LEDGER:   *** A/R Ledger...
          IF XTYPE = '' THEN XTYPE = '$$$'
          ARLED.INQ CN:VM:XTYPE
          IF XTYPE = '$$$' THEN XTYPE = ''
          RETURN
*-------------------------------------------------------------------------*
VIEW:     *** display detail of current line
          * Check users authorization to view
          CHECK.KEY 'SOE.ALLOWED',VIEW.OK
          IF NOT(VIEW.OK) THEN RETURN

          IF LINE <= IDN THEN
             DTID = DTIDS<LINE>
             BEGIN CASE
             CASE DTID = 'B30'
                BF.DET.VIEW =  YES
                PREV.DTIDS = DTIDS
                DTIDS = DTIDS.30
                RETURN TO REDISP2
             CASE DTID = 'B60'
                BF.DET.VIEW =  YES
                PREV.DTIDS = DTIDS
                DTIDS = DTIDS.60
                RETURN TO REDISP2
             CASE DTID = 'B90'
                BF.DET.VIEW =  YES
                PREV.DTIDS = DTIDS
                DTIDS = DTIDS.90
                RETURN TO REDISP2
             CASE DTID = 'B120'
                BF.DET.VIEW =  YES
                PREV.DTIDS = DTIDS
                DTIDS = DTIDS.120
                RETURN TO REDISP2
             CASE OTHERWISE
                REF.ID = OCONV(DTIDS<LINE>,'G1.2')
                OID    = FIELD(REF.ID,'.',1)
                INVN   = FIELD(REF.ID,'.',2)+0
                READV INVNS FROM LEDFILE,OID,8 ELSE INVNS = ''
                LOCATE INVN IN INVNS<1> SETTING GEN ELSE PRINT BELL:;RETURN
                INIT.VIEW = 1
                V.ONLY    = YES
                VIEW.EDIT.LED OID,GEN,V.ONLY,INIT.VIEW
             END CASE
          END
          RETURN
*-------------------------------------------------------------------------*
EDIT:     *** allows you to edit invoice

          * Check users auth to edit
          CHECK.KEY 'SOE.ALLOWED',EDIT.OK,SOE.LVL
          IF NOT(EDIT.OK) THEN RETURN
          IF SOE.LVL < 3 THEN VIEW.O = YES ELSE VIEW.O = NO

          IF DTIDS<LINE>[1,1] = 'B' THEN RETURN
          IF LINE <= IDN THEN
             REF.ID = OCONV(DTIDS<LINE>,'G1.2')
             INIT.VIEW = 1
             OID    = FIELD(REF.ID,'.',1)
             INVN   = FIELD(REF.ID,'.',2)+0
             READV INVNS FROM LEDFILE,OID,8 ELSE INVNS = ''
             LOCATE INVN IN INVNS<1> SETTING GEN ELSE PRINT BELL:; RETURN
             MODE   = REF.ID[1,1]
             VIEW.EDIT.LED OID,GEN,VIEW.O,INIT.VIEW
          END
          RETURN
*-------------------------------------------------------------------------*
AUDIT: * displays the audit screen
          IF DTIDS<LINE>[1,1] = 'B' THEN RETURN
          AID = BT:'.':DTIDS<LINE>
          AR.AUDIT AID
          RETURN
*-------------------------------------------------------------------------*
INQUIRY:  * view additional information

          AR.INQ.INQ CHOICE

          BEGIN CASE
          CASE CHOICE = 1;  GOTO ORDERS
          CASE CHOICE = 2;  GOTO BIDS
          CASE CHOICE = 3;  GOTO CUSTMNT
          CASE CHOICE = 4;  GOTO EIS
          CASE CHOICE = 5;  CUS.SALES.HIST CN:AM:SECURITY<9>:AM:1
          CASE CHOICE = 6;  GOTO EGRAPH
          CASE CHOICE = 7 AND ABC.ENABLED$
             CUS.SALES.HIST CN:AM:SECURITY<9>:AM:2:AM:SEL.BT.ONLY
          CASE CHOICE = 8
             AR.CUST.INFO CN
          END CASE

          RETURN
*-------------------------------------------------------------------------*
*** Customer maintance hotkey. OID.DATA$<1> has to be reset for imaging
*** to work in customer.maint
CUSTMNT:
          SAVE.OID1 = ''
          SAVE.OID1 = OID.DATA$<1>
          OID.DATA$<1> = ''
          CUSTOMER.MAINT CN
          OID.DATA$<1> = SAVE.OID1

          BT = GET.BT.AR(CN)
          GET.CUS '',BT,CN,''

          GOSUB DISP1
          GOSUB GET.INFO
          GOSUB DISP2
          RETURN
*-------------------------------------------------------------------------*
ACTVTY:   *** View the activity log

          JOB.TRACKING.VIEW 'CUST~':CN:VM:DFLT.CUST.SRC
          RETURN
*-------------------------------------------------------------------------*
SALES:    *** view sales history
          CUS.SALES.HIST CN:AM:SECURITY<9>
          RETURN
*-------------------------------------------------------------------------*
EGRAPH:   *** display the graph for the current customer aging buckets.
          EGRAPH.AR.INQ CN,MAT AGDESC,AGT
          RETURN
*-------------------------------------------------------------------------*
LOG.CALL: *** Log the collection call
          * Get the AR Record for this customer if it exists.

          HBR = CUS(53)
          ARC.ID = HBR:'~':CN
          READ ARC.REC FROM ARCFILE,ARC.ID ELSE ARC.REC=''

          * If the AR Collection ID was not found then create a new
          * AR Collection Record
          IF ARC.REC  = '' THEN
             * Create a new AR Collection record
             AR.CREATE.COLL.REC CN,ARC.ID
          END

          READV NCALL FROM ARCFILE,ARC.ID,18 ELSE NCALL = ''
          AR.COLLECTION.LOG ARC.ID,NCALL
          RETURN
*-------------------------------------------------------------------------*
EIS:      *** Goto the EIS Drill Down routine to let the user specify what
          *** they wish to graph.

          UT.SEC3 14,AUTH.OK,,YES
          IF AUTH.OK#YES THEN RETURN

          READ PERIODS FROM WORKFILE,'EIS~PERIODS' ELSE RETURN
          LAST.PERIOD = ''
          PRD.SEL=''

          SS=1
          LOOP
          TPRD=PERIODS<1,SS>
          UNTIL TPRD='' DO
          TTYPE=PERIODS<4,SS>
          IF TPRD # LAST.PERIOD THEN
             IF TTYPE='Daily' OR TTYPE='Weekly' THEN NULL ELSE
                INS TPRD BEFORE PRD.SEL<1,-1>
             END
          END
          SS += 1
          REPEAT

          IF LAST.PERIOD THEN INS LAST.PERIOD BEFORE PRD.SEL<1,1>
          MAX.PRD = DCOUNT(PRD.SEL,VM)
SEL.PRD:  PERIOD=''
          QUIT=''
          MENU.TABLE PERIOD,,,1,MAX.PRD,30,,,PRD.SEL,'Sales Graph Periods'
          IF QUIT THEN RETURN
          IF PERIOD='' THEN GOTO SEL.PRD
          EIS.DATA = 'EGRAPH'
          EIS.DATA<1,1,3>  = CUSS(9)
          EIS.DATA<1,1,5>  = CN:'~CB'
          IF AOD = '' THEN ASOF=DATE() ELSE ASOF=AOD
          EIS.DATA<1,1,6>  = ASOF:'~DR'
          BRS.ALL.GET ABRS
          ABRS = LOWER(ABRS)
          CONVERT VM TO ']' IN ABRS
          EIS.DATA<1,1,7>  = 'Sales~Billto Customer~~ALL~':ABRS:'~':ASOF:'~*':PERIOD:'~~~Net Stock&Direct~Sales $~~0~3D Bar~Billto Customer~Sales'
          EIS.DRILL.DOWN EIS.DATA

          RETURN
*-------------------------------------------------------------------------*
XCH:      *** Change the currency rate we are viewing.
          SV.XTYPL = XTYPE
IN$$2:    INP.PROMPT XTYPE,'Enter New Currency : ',,10,'S:VERF.XCURR.ID'
          IF SV.XTYPL # XTYPE THEN
             * Print header char '' over each character of the
             * previous exchange rate type
             BASE.LGTH = LEN(SV.XTYPL)
             FOR XPOS = 1 TO BASE.LGTH
                PRINT @(78-XPOS,0):NORM$:''
             NEXT XPOS
             IF XTYPE = '' THEN
                * Base currencey
                XRATE = 1
             END ELSE
                * New exchange type/rate
                XCURR.RATE.GET XRATE,XTYPE,XDATE
                XRATE = OCONV(XRATE,'MR4')
                PRINT @(78-LEN(XTYPE),0):BLINK$:XTYPE:NORM$
             END
             RETURN TO REDISP
          END
          RETURN
*-------------------------------------------------------------------------*
CHG.MO.DISP: * change month display
          IF MO.DISP=6 THEN MO.DISP=12 ELSE MO.DISP=6
          TOGGLE=1
          GOSUB DISP2
          RETURN
*-------------------------------------------------------------------------*
CHNGV:    *** This is used to toggle between the views in ar inquiry.
          CHNG.LINE = LINE; NEW.VIEW = ''

          VIEW.OPTS  = 'Reference #,Customer P/O #,Job Name #,Old Invoice#'
          CONVERT ',' TO VM IN VIEW.OPTS

          MENU.TABLE NEW.VIEW,,,1,4,15,,,VIEW.OPTS,'View',TOG.VIEW
          LOCATE NEW.VIEW IN VIEW.OPTS<1> SETTING NVIEW ELSE NVIEW = 1
          IF QUIT THEN QUIT = ''; F12 = ''; RETURN

          * This is used to switch the view  type.
          * TOG.VIEW = 3 is the legacy invoice ID in LED(83)
          * TOG.VIEW = 2 is the PO in place of OID view
          * TOG.VIEW = 1 is the normal view with the OID displayed
          IF NVIEW # TOG.VIEW THEN
             TOG.VIEW = NVIEW
             BEGIN CASE
             CASE TOG.VIEW = 1
                TOP =  'Reference #'
             CASE TOG.VIEW = 2
                TOP =  'Customer P/O #'
             CASE TOG.VIEW = 3
                TOP =  'Job Name'
             CASE OTHERWISE
                TOP =  'Old Invoice #'
             END CASE

             PRINT @(1,10):TOP

             *** we need to clear the info displayed to the screen to
             *** display the view.
             VCLR
             FOR IDX = 1 TO IDN
                GOSUB DLINE
             NEXT IDX
          END

          *** make sure that they go to the line they were currently on
          *** when they return
          LINE = CHNG.LINE

          RETURN TO MOVENEXT
*-------------------------------------------------------------------------*
RESET.VIEW: *** return to balance forward view if view balance forward
            *** detail
          IF BF.DET.VIEW THEN
             BF.DET.VIEW = NO
             DTIDS = PREV.DTIDS
             RETURN TO REDISP2
          END
          RETURN
*-------------------------------------------------------------------------*
!TSMITH~06/05/14~12:23
